package com.nwpu.am.exception;





import com.nwpu.am.result.Result;
import io.swagger.annotations.Api;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestControllerAdvice;

/**
 * Description:
 * 全局异常捕获类
 * 所有的异常都会在这个类中处理
 *
 */
@Api(tags = "全局异常捕获类")
@RestControllerAdvice
@Slf4j
@ResponseBody
public class GlobalExceptionHandler {

    /**
     * 捕获自定义的几种异常
     *
     * @param ex
     * @return 异常码和异常信息封装的ResultData对象
     */
    @ExceptionHandler(value = BizException.class)
    public Result<Exception> handlerBizException(Exception ex){

        // 向下转型使BizException的自定义的不同于父类Exception的方法可以使用
        BizException bizException = (BizException)ex;

        // 获得异常码和异常信息
        int exCode = bizException.getExceptionCode();
        String exMsg = bizException.getExceptionMsg();

        // 将异常码和异常信息封装成通用数据返回类型
        Result<Exception>resultData = Result.error(exMsg );

        // 对异常做日志记录，方便项目正式运行时发生异常后寻找异常发生点
        log.error(exCode + ":" +exMsg,bizException);

        // 向前端返回数据
        return resultData;
    }

    /**
     * 系统抛出的异常
     * @param ex
     * @return 固定异常码10002 和 异常信息封装的ResultData对象
     */
    @ExceptionHandler(value = Exception.class)
    public Result<Exception> handlerException(Exception ex){

        // 对所以其他异常，统一异常码为10002，并封装
        Result<Exception> resultData = Result.error(ex.getMessage());

        // 日志记录
        log.error(10002 + ":" +ex.getMessage(),ex);

        // 返回数据
        return resultData;
    }

}
